using System;
using Gtk;
using System.IO;
using Gdk;
using animeshell;

public class MainWindow: Gtk.Window
{
	protected Gtk.Image imgCover;
	protected Gtk.TreeIter iter;
	protected Gtk.TreeView treeview1;
	protected Gtk.ListStore AnimeDB;
	protected Gtk.Image imgCoverSupprimer;
	protected Gtk.Entry txtSupNom;
	protected Gtk.Entry txtSupDvd;
	protected Gtk.Entry txtSupImage;
	protected Gtk.Button btnSupComplete;
	protected Gtk.Button btnSupImage;
	protected Gtk.RadioButton rbDvd;
	protected Gtk.RadioButton rbCD;
	protected Gtk.RadioButton rbHdd;
	protected Gtk.Button btnAddComplete;
	protected Gtk.Entry txtAddNom;
	protected Gtk.Entry txtAddDvd;
	protected Gtk.Entry txtAddComment;
	protected Gtk.Entry txtAddImNom;
	protected Gtk.Entry txtAddImDvd;
	protected Gtk.Entry txtAddImImage;
	protected Gtk.Button btnSelection;
	protected Gtk.Button btnAddImage;
	protected Gtk.Action Ajouter;
	protected Gtk.Action Supprimer;
	protected Gtk.Action RechercheInterne;
	protected Gtk.Action RechercheExterne;
	protected Gtk.Action Quitter;
	protected Gtk.Action Propos;
	protected Gtk.Action ObtenirDeLAide;
	protected Gtk.Notebook notebook1;
	protected Gtk.Action Importer;
	protected Gtk.Action Exporter;
	protected Gtk.Entry txtAddNewComment;
	protected Gtk.Action Prefrences;
	protected Gtk.Button btnAddSelection;
	protected Gtk.Label label3;
	protected Gtk.Entry txtAddImage;
	
	
	//*****************************************************************************
	// Variables
	//*****************************************************************************
	protected Traitement CTraitement;
	protected FileSelection fselect;
	
	
	public MainWindow (): base ("")
	{
		Stetic.Gui.Build (this, typeof(MainWindow));
		CTraitement = new Traitement();
		FuncStart();
		ShowTreeview();
	}
	
	//*****************************************************************************
	// Fonction préalable au démarrage
	//*****************************************************************************
	private void FuncStart()
	{
		bool Retour = false;
		Retour = CTraitement.SelectEnv();
		if (Retour != true)
		{
			MessageDialog md = new MessageDialog (null,DialogFlags.DestroyWithParent,
				                   MessageType.Error,ButtonsType.Close,
				                   "Une erreur s'est produite lors de la configuration initiale\r\n"+
				                   "Veuillez signaler cette erreur.");
			md.Run();
			md.Destroy();
			Application.Quit();
		}
		
		Retour = CTraitement.CompleteConf();
		if (Retour != true)
		{
			MessageDialog md2 = new MessageDialog (null,DialogFlags.DestroyWithParent,
				                   MessageType.Error,ButtonsType.Close,
				                   "Une erreur s'est produite lors de la création des fichiers d'animeshell\r\n"+
				                   "Veuillez signaler cette erreur.");
			md2.Run();
			md2.Destroy();
			Application.Quit();
		}
		
		CTraitement.LoadRc();
		Retour = CTraitement.Lecture_Initiale();
		if (Retour != true)
		{
			MessageDialog md2 = new MessageDialog (null,DialogFlags.DestroyWithParent,
				                   MessageType.Error,ButtonsType.Close,
				                   "Une erreur s'est produite lors de la lecture des fichiers d'animeshell\r\n"+
				                   "Veuillez signaler cette erreur.");
			md2.Run();
			md2.Destroy();
			Application.Quit();
		}
	}
	
	//*****************************************************************************
	// Build the treeview
	//*****************************************************************************
	private void ShowTreeview()
	{
		bool Retour = false;
		AnimeDB = new Gtk.ListStore (typeof (int), typeof (string), typeof (Gdk.Pixbuf), typeof (string));
		
		treeview1.AppendColumn("ID", new Gtk.CellRendererText(), "text", 0);
		treeview1.AppendColumn("Nom", new Gtk.CellRendererText(), "text", 1);
		treeview1.AppendColumn("Type", new Gtk.CellRendererPixbuf(), "pixbuf", 2);
		treeview1.AppendColumn("# Support", new Gtk.CellRendererText(), "text", 3);
		
		
		treeview1.Model = AnimeDB;
		
		Retour = CTraitement.Affichage_Treeview(ref AnimeDB);
		
		if (Retour != true)
		{
			MessageDialog md = new MessageDialog (null,DialogFlags.DestroyWithParent,
				                   MessageType.Error,ButtonsType.Close,
				                   "Une erreur s'est produite lors de la lecture des fichiers d'animeshell\r\n"+
				                   "Veuillez signaler cette erreur.");
			md.Run();
			md.Destroy();
			Application.Quit();
		}
		
		
		
		// Event on treeview
		treeview1.Selection.Changed += OnSelectionEntry;
		
	}
	
	//*****************************************************************************
	// event when user click in the treeview
	//*****************************************************************************
	protected void OnSelectionEntry(object o, EventArgs args)
	{
		TreeModel model;
	
		if (((TreeSelection)o).GetSelected(out model, out iter))
		{
			CTraitement.TreeviewSelectID = (int)model.GetValue (iter, 0);
			CTraitement.TreeviewSelect = (string)model.GetValue (iter, 1);
			CTraitement.TreeviewSelectdvd = (string)model.GetValue (iter, 3);
			
			CTraitement.ImageSearch(imgCover);
		}
	}
	
	protected void OnDeleteEvent (object sender, DeleteEventArgs a)
	{
		Application.Quit ();
		a.RetVal = true;
	}
	
	protected virtual void mmAjouter(object sender, System.EventArgs e)
	{
		notebook1.CurrentPage = 1;
	}

	protected virtual void mmSupprimer(object sender, System.EventArgs e)
	{
		notebook1.CurrentPage = 2;
	}

	protected virtual void mmRechercheInterne(object sender, System.EventArgs e)
	{
		Gtk.Window RechercheInterneWindow = new animeshell.RechercheInterne(CTraitement);
		RechercheInterneWindow.Show();
	}

	protected virtual void mmRechercheExterne(object sender, System.EventArgs e)
	{
		Gtk.Window RechercherExterneWindow = new animeshell.RechercheExterne(CTraitement);
		RechercherExterneWindow.Show();
	}

	protected virtual void mmQuitter(object sender, System.EventArgs e)
	{
		Application.Quit();
	}

	protected virtual void mmAPropos(object sender, System.EventArgs e)
	{
		Gtk.Window Info = new animeshell.Info();
		Info.Show();
	}

	protected virtual void mmAide(object sender, System.EventArgs e)
	{
		
	}

	protected virtual void mmImport(object sender, System.EventArgs e)
	{
		
	}

	protected virtual void mmExport(object sender, System.EventArgs e)
	{
		
	}

	protected virtual void mmPreference(object sender, System.EventArgs e)
	{
		Gtk.Window PreferenceGui = new animeshell.Preference(CTraitement);
		PreferenceGui.Show();
	}
	
	//**************************************************************************
	// Fonction pour l'ajout complète du entrée
	//**************************************************************************
	protected virtual void btnAddComplete_Click(object sender, System.EventArgs e)
	{
		// Variables
		string Nom = txtAddNom.Text;
		string DVD = txtAddDvd.Text;
		string Commentaire = txtAddComment.Text;
		string Image = txtAddImage.Text;
		char cType = ' ';
		bool Retour = false;
		MessageDialog md;
		
		// Validation des données
		if (Nom == "" || DVD == "")
		{
			md = new MessageDialog (null,DialogFlags.DestroyWithParent,
				                   MessageType.Info,ButtonsType.Close,
				                   "Le nom et le numéro de support sont nécessaire à l'ajout d'entrée.");
			md.Run();
			md.Destroy();
			return;
		}
		
		// Recherche le type d'entrée
		if (rbHdd.Active)
			cType = 'h';
		else
		{
			if (rbCD.Active)
				cType = 'c';
			else
				cType = 'd';
		}
		
		// Appelle de la fonction d'ajout
		Retour = CTraitement.AjoutComplet(Nom, cType, DVD, Commentaire);
		if (Retour)
		{
			if (Image != "")
			{
				Retour = CTraitement.CopyImage(Image);
				if (Retour)
				{
					CTraitement.ID++;
					CTraitement.Affichage_Treeview(ref AnimeDB);
					
					md = new MessageDialog (null,DialogFlags.DestroyWithParent,
				                   MessageType.Info,ButtonsType.Close,
				                   "Ajout effectuée avec succès");
					md.Run();
					md.Destroy();
				}
			}
		}
		else
		{
			md = new MessageDialog (null,DialogFlags.DestroyWithParent,
				                   MessageType.Error,ButtonsType.Close,
				                   "Une erreur s'est produite lors de l'ajout de l'entrée.");
			md.Run();
			md.Destroy();
		}
	}

	protected virtual void btnAddSelection_Click(object sender, System.EventArgs e)
	{
		fselect = new FileSelection("Sélection de votre navigateur Internet");
		fselect.HideFileopButtons();
		fselect.Response += new ResponseHandler (OnFileSelectionResponse);		
		fselect.Run();
		
	}
	
	protected void OnFileSelectionResponse (object o, ResponseArgs args)
	{
		try
		{
			if (args.ResponseId == ResponseType.Ok)
   			{
     			txtAddImage.Text = fselect.Filename;
   				fselect.Hide();
     		}
     		else
     		{
     			fselect.Hide();
     		}
		}
		catch(Exception EX)
		{
			MessageDialog md = new MessageDialog (null,DialogFlags.DestroyWithParent,MessageType.Error, 
		                                         ButtonsType.Close, "Erreur lors de la sélection.\r\n\r\n"+EX.ToString());
			md.Run();
			md.Destroy();
		}
	}
	//**************************************************************************
	
	
	//**************************************************************************
	// Fonction pour la modification d'une entrée
	//**************************************************************************
	protected virtual void btnAddImage_Click(object sender, System.EventArgs e)
	{
		
	}

	protected virtual void btnSelection_Click(object sender, System.EventArgs e)
	{
		
	}
	//**************************************************************************
	
	
	//**************************************************************************
	// Suppression
	//**************************************************************************
	protected virtual void btnSupComplete_Click(object sender, System.EventArgs e)
	{
	}
	
	protected virtual void btnSupImage_Click(object sender, System.EventArgs e)
	{
	}
}